package org.jetlinks.pro.notify.wechat.official;

import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.Setter;
import org.jetlinks.core.Values;
import org.jetlinks.pro.notify.template.Template;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import javax.validation.constraints.NotBlank;
import java.util.Map;

@Getter
@Setter
public class WechatOfficialMessageTemplate implements Template {

    @NotBlank(message = "通知配置ID不能为空")
    private String configId;

    @NotBlank(message = "接收者openid不能为空")
    private String touser;

    @NotBlank(message = "微信模板ID不能为空")
    private String wxTemplateId;

    /**
     * 模板跳转链接
     */
    private String url;

    /**
     * 所需跳转到的小程序appid（该小程序appid必须与发模板消息的公众号是绑定关联关系，暂不支持小游戏）
     */
    private String miniProgramId;

    /**
     * 所需跳转到小程序的具体页面路径，支持带参数,（示例index?foo=bar），要求该小程序已发布
     * (可不填)
     */
    private String miniProgramPath;

    /**
     * 请求模板数据参数（根据上下文变量的值组装）
     */
    private JSONObject data = new JSONObject();

    /**
     * 模板标题
     */
    private String title;


    /**
     * 模板内容
     */
    private String content;


    public JSONObject createJsonRequest(Values context) {
        JSONObject json = new JSONObject();
        json.put("touser", touser);
        json.put("template_id", wxTemplateId);
        if (StringUtils.hasText(url)) {
            json.put("url", url);
        }
        if (StringUtils.hasText(miniProgramId)) {
            JSONObject miniProgram = new JSONObject();
            miniProgram.put("appid", miniProgramId);
            if (StringUtils.hasText(miniProgramPath)) {
                miniProgram.put("pagepath", miniProgramPath);
            }
            json.put("miniprogram", miniProgram);
        }
        Map<String, Object> allValues = context.getAllValues();
        if (!ObjectUtils.isEmpty(allValues)) {
            allValues.forEach((k, v) -> {
                JSONObject datas = new JSONObject();
                datas.put("value", v);
                data.put(k, datas);
            });
            json.put("data", data);
        }
        return json;
    }

}
